Telegram Group & Telegram Channel
Forwarded from Learn Python
⌯ الديكوريتر ( Decorators ) :
ـ = = = = = = = = = = = = = = =
• الديكوريتر (أو ما يعرف بالمُعلِّق الوظيفي في بايثون) هو أسلوب برمجي يُستعمل للتعديل على سلوك الدوال أو الكلاسات دون الحاجة إلى التعديل على بنية الكود الأصلي.

• يتم ذلك عن طريق تغليف الدالة/الكلاس بدالة خارجية (تسمى الديكوريتر) تضيف أو تحسّن وظائف معيّنة قبل أو بعد أو حتى أثناء تنفيذ الدالة الأساسية.

⌯ كيف نُعرِّف (نستخدم) الديكوريتر ؟
ـ = = = = = = = = = = = = = = = = =
• عادةً يُنشأ الديكوريتر بواسطة دالة عليا ( Higher Order Function ) تستقبل دالة كمدخل، ثم تُرجع دالة جديدة بداخلها، تحتوي على كود إضافي أو معدل (التغليف).

مثال بسيط :

def my_decorator(func):
def wrapper():
print("قبل تنفيذ الدالة ...")
func()
print("بعد تنفيذ الدالة ...")
return wrapper

@my_decorator
def say_hello():
print("مرحباً بالجميع!")

say_hello()

هنا:

1. ‏تُعرَّف الدالة my_decorator التي تستقبل الدالة func كوسيط.


2. ‏تُنشأ داخلها دالة أخرى اسمها wrapper تُنفذ أي كود إضافي قبل وبعد استدعاء func().


3. عندما نضع
@my_decorator فوق الدالة say_hello، فهذا يعني أننا نطبّق التغليف نفسه على الدالة say_hello.


⌯ استخدامات الديكوريتر الشائعة :
ـ = = = = = = = = = = = = = = = = = = = =
• تسجيل النشاط Logging: مثلاً تسجيل وقت تنفيذ الدالة أو القيم المعادة.
• التأكد من الصلاحيات Checking Permissions: مثل أن يُنفذ كود معيّن فقط إن كان المستخدم لديه الصلاحيات المناسبة.
• قياس الأداء Performance Measurement: حساب المدة الزمنية التي تستغرقها الدالة في التنفيذ.
• التخزين المؤقت Caching: لتسريع استدعاء الدوال ذات الحسابات الثقيلة بتخزين نتائجها وإعادة استخدام النتيجة المخبأة عند الاستدعاء مرة أخرى.

⌯ ديكوريتر الدوال والدوال ذات الوسائط ( Arguments ) :
ـ = = = = = = = = = = = = = = = = = = = =
• يمكن استخدام الديكوريتر مع دوال تأخذ وسائط، بحيث يتم تمرير تلك الوسائط للـ wrapper.

مثال:

def decorator_with_args(func):
def wrapper(*args, **kwargs):
print("تم استدعاء الدالة بالوسائط التالية:", args, kwargs)
return func(*args, **kwargs)
return wrapper

@decorator_with_args
def add(a, b):
return a + b

result = add(3, 5)
print("النتيجة:", result)

في هذا المثال:

1. نستخدم *args و **kwargs داخل wrapper حتى نلتقط أي عدد من الوسائط.

2. نطبع الوسائط قبل أن ننفذ الدالة الأصلية.
3. نعيد الناتج النهائي للدالة add.


⌯ ديكوريتر الكلاسات ( Class Decorators ) :
ـ = = = = = = = = = = = = = = = = = = = =
• يمكن أيضاً تطبيق ديكوريتر على الكلاسات بوضع
@decorator_name فوق تعريف الكلاس.
• يتم تمرير الكلاس نفسه إلى الديكوريتر كوسيط، ثم يُعاد كلاس جديد أو نفس الكلاس مع تعديل أو إضافة بعض الخصائص عليه.

مثال بسيط :

def class_decorator(cls):
class NewClass(cls):
def new_method(self):
print("هذه دالة جديدة تمت إضافتها عن طريق الديكوريتر")
return NewClass

@class_decorator
class MyClass:
def original_method(self):
print("هذه الدالة الأصلية من MyClass")

obj = MyClass()
obj.original_method()
obj.new_method()

هنا:

1. يستقبل الديكوريتر class_decorator الكلاس MyClass.

2. ننشئ كلاس جديد اسمه NewClass يرث من MyClass ويحتوي على دالة إضافية.

3. نعيد هذا الكلاس الجديد بدلًا من الأصلي، فيكون بالإمكان استدعاء الدالة الجديدة.

4. كما لايقتصر استخدامه على الكلاسات فقط بل على الدوال أيضاً على سبيل المثال

def check(clc):
def comp(a, b):
if a > 0 and b > 0:
print("pass")
clc(a, b)
else:
print("error")
return comp

@check
def calculator(a, b):
print(a + b)

calculator(0, 5)

في هذا المثال قمنا بتعريف (chack) يقوم بفحص الاعداد اذا كانت اكبر من 0 ومن ثم قمنا باستخدامها في داله (calculator).



tg-me.com/Pythonarabe/1126
Create:
Last Update:

⌯ الديكوريتر ( Decorators ) :
ـ = = = = = = = = = = = = = = =
• الديكوريتر (أو ما يعرف بالمُعلِّق الوظيفي في بايثون) هو أسلوب برمجي يُستعمل للتعديل على سلوك الدوال أو الكلاسات دون الحاجة إلى التعديل على بنية الكود الأصلي.

• يتم ذلك عن طريق تغليف الدالة/الكلاس بدالة خارجية (تسمى الديكوريتر) تضيف أو تحسّن وظائف معيّنة قبل أو بعد أو حتى أثناء تنفيذ الدالة الأساسية.

⌯ كيف نُعرِّف (نستخدم) الديكوريتر ؟
ـ = = = = = = = = = = = = = = = = =
• عادةً يُنشأ الديكوريتر بواسطة دالة عليا ( Higher Order Function ) تستقبل دالة كمدخل، ثم تُرجع دالة جديدة بداخلها، تحتوي على كود إضافي أو معدل (التغليف).

مثال بسيط :

def my_decorator(func):
def wrapper():
print("قبل تنفيذ الدالة ...")
func()
print("بعد تنفيذ الدالة ...")
return wrapper

@my_decorator
def say_hello():
print("مرحباً بالجميع!")

say_hello()

هنا:

1. ‏تُعرَّف الدالة my_decorator التي تستقبل الدالة func كوسيط.


2. ‏تُنشأ داخلها دالة أخرى اسمها wrapper تُنفذ أي كود إضافي قبل وبعد استدعاء func().


3. عندما نضع
@my_decorator فوق الدالة say_hello، فهذا يعني أننا نطبّق التغليف نفسه على الدالة say_hello.


⌯ استخدامات الديكوريتر الشائعة :
ـ = = = = = = = = = = = = = = = = = = = =
• تسجيل النشاط Logging: مثلاً تسجيل وقت تنفيذ الدالة أو القيم المعادة.
• التأكد من الصلاحيات Checking Permissions: مثل أن يُنفذ كود معيّن فقط إن كان المستخدم لديه الصلاحيات المناسبة.
• قياس الأداء Performance Measurement: حساب المدة الزمنية التي تستغرقها الدالة في التنفيذ.
• التخزين المؤقت Caching: لتسريع استدعاء الدوال ذات الحسابات الثقيلة بتخزين نتائجها وإعادة استخدام النتيجة المخبأة عند الاستدعاء مرة أخرى.

⌯ ديكوريتر الدوال والدوال ذات الوسائط ( Arguments ) :
ـ = = = = = = = = = = = = = = = = = = = =
• يمكن استخدام الديكوريتر مع دوال تأخذ وسائط، بحيث يتم تمرير تلك الوسائط للـ wrapper.

مثال:

def decorator_with_args(func):
def wrapper(*args, **kwargs):
print("تم استدعاء الدالة بالوسائط التالية:", args, kwargs)
return func(*args, **kwargs)
return wrapper

@decorator_with_args
def add(a, b):
return a + b

result = add(3, 5)
print("النتيجة:", result)

في هذا المثال:

1. نستخدم *args و **kwargs داخل wrapper حتى نلتقط أي عدد من الوسائط.

2. نطبع الوسائط قبل أن ننفذ الدالة الأصلية.
3. نعيد الناتج النهائي للدالة add.


⌯ ديكوريتر الكلاسات ( Class Decorators ) :
ـ = = = = = = = = = = = = = = = = = = = =
• يمكن أيضاً تطبيق ديكوريتر على الكلاسات بوضع
@decorator_name فوق تعريف الكلاس.
• يتم تمرير الكلاس نفسه إلى الديكوريتر كوسيط، ثم يُعاد كلاس جديد أو نفس الكلاس مع تعديل أو إضافة بعض الخصائص عليه.

مثال بسيط :

def class_decorator(cls):
class NewClass(cls):
def new_method(self):
print("هذه دالة جديدة تمت إضافتها عن طريق الديكوريتر")
return NewClass

@class_decorator
class MyClass:
def original_method(self):
print("هذه الدالة الأصلية من MyClass")

obj = MyClass()
obj.original_method()
obj.new_method()

هنا:

1. يستقبل الديكوريتر class_decorator الكلاس MyClass.

2. ننشئ كلاس جديد اسمه NewClass يرث من MyClass ويحتوي على دالة إضافية.

3. نعيد هذا الكلاس الجديد بدلًا من الأصلي، فيكون بالإمكان استدعاء الدالة الجديدة.

4. كما لايقتصر استخدامه على الكلاسات فقط بل على الدوال أيضاً على سبيل المثال

def check(clc):
def comp(a, b):
if a > 0 and b > 0:
print("pass")
clc(a, b)
else:
print("error")
return comp

@check
def calculator(a, b):
print(a + b)

calculator(0, 5)

في هذا المثال قمنا بتعريف (chack) يقوم بفحص الاعداد اذا كانت اكبر من 0 ومن ثم قمنا باستخدامها في داله (calculator).

BY بايثون العرب | Python Arab 🇵🇸


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/Pythonarabe/1126

View MORE
Open in Telegram


🇵🇸 بايثون العرب Python Arab 🇵🇸 Telegram | DID YOU KNOW?

Date: |

Telegram hopes to raise $1bn with a convertible bond private placement

The super secure UAE-based Telegram messenger service, developed by Russian-born software icon Pavel Durov, is looking to raise $1bn through a bond placement to a limited number of investors from Russia, Europe, Asia and the Middle East, the Kommersant daily reported citing unnamed sources on February 18, 2021.The issue reportedly comprises exchange bonds that could be converted into equity in the messaging service that is currently 100% owned by Durov and his brother Nikolai.Kommersant reports that the price of the conversion would be at a 10% discount to a potential IPO should it happen within five years.The minimum bond placement is said to be set at $50mn, but could be lowered to $10mn. Five-year bonds could carry an annual coupon of 7-8%.

Among the actives, Ascendas REIT sank 0.64 percent, while CapitaLand Integrated Commercial Trust plummeted 1.42 percent, City Developments plunged 1.12 percent, Dairy Farm International tumbled 0.86 percent, DBS Group skidded 0.68 percent, Genting Singapore retreated 0.67 percent, Hongkong Land climbed 1.30 percent, Mapletree Commercial Trust lost 0.47 percent, Mapletree Logistics Trust tanked 0.95 percent, Oversea-Chinese Banking Corporation dropped 0.61 percent, SATS rose 0.24 percent, SembCorp Industries shed 0.54 percent, Singapore Airlines surrendered 0.79 percent, Singapore Exchange slid 0.30 percent, Singapore Press Holdings declined 1.03 percent, Singapore Technologies Engineering dipped 0.26 percent, SingTel advanced 0.81 percent, United Overseas Bank fell 0.39 percent, Wilmar International eased 0.24 percent, Yangzijiang Shipbuilding jumped 1.42 percent and Keppel Corp, Thai Beverage, CapitaLand and Comfort DelGro were unchanged.

🇵🇸 بايثون العرب Python Arab 🇵🇸 from in


Telegram بايثون العرب | Python Arab 🇵🇸
FROM USA